home *** CD-ROM | disk | FTP | other *** search
- unit PipeServer;
-
- interface
-
- Uses
- Classes, Outlook;
-
- Const
- strPipeName = '\\.\pipe\weblook_tdm_version_1';
-
- Type
- TPipeServerThread = Class(TThread)
- Protected
- strMessage : String;
- Procedure LogMessage;
- Function ProcessPipeRequest(strRequest : String) : String;
- Function GetCalendarResponse(strDate : String) : String;
- Function GetContactResponse(strIndex : String) : String;
- Function GetTaskResponse(strIndex : String) : String;
- Function GetNoteResponse(strIndex : String) : String;
- Function GetInboxResponse(strIndex : String) : String;
- Public
- ooOutlook : TOutlookObjects;
- Procedure Execute; Override;
- End;
-
- implementation
-
- Uses Windows,SysUtils,MainForm,ActiveX;
-
- Procedure TPipeServerThread.Execute;
- Var
- hPipe : THandle;
- bConnected : Boolean;
- cRequest : Array[0..1024-1] of Char; { 1kB }
- iBR,iBW : Cardinal; { bytes read, bytes written }
- strResponse : String;
-
- Begin
- hPipe := CreateNamedPipe(strPipeName,Pipe_Access_Duplex,Pipe_Type_Byte Or Pipe_Wait,1,
- 4096,4096,nmpWait_Use_Default_Wait,nil);
- If (hPipe = Invalid_Handle_Value) Then Begin
- strMessage := 'Cannot create pipe: '+SysErrorMessage(GetLastError);
- Synchronize(LogMessage);
- Exit;
- End;
- CoInitialize(nil);
- While (Not Terminated) do Begin
- bConnected := ConnectNamedPipe(hPipe,nil);
- If ((Not bConnected) And (GetLastError = Error_Pipe_Connected)) Then
- bConnected := True; { if a client connected between the CreatePipe and ConnectPipe calls }
- If bConnected Then Begin
- If (Not ReadFile(hPipe,cRequest,SizeOf(cRequest),iBR,nil)) Then Begin
- strMessage := 'Cannot read from pipe: '+SysErrorMessage(GetLastError);
- Synchronize(LogMessage);
- End
- Else Begin
- cRequest[iBR] := #0; { properly terminate the string }
- strMessage := 'Got request "'+cRequest+'"';
- Synchronize(LogMessage);
- If (cRequest = 'FREE') Then Begin
- strMessage := 'Freeing Outlook objects';
- Synchronize(LogMessage);
- ooOutlook.Free;
- End
- Else Begin
- strResponse := ProcessPipeRequest(cRequest);
- strMessage := 'Responding "'+strResponse+'"';
- Synchronize(LogMessage);
- WriteFile(hPipe,Pointer(strResponse)^,Length(strResponse),iBW,nil);
- FlushFileBuffers(hPipe); { make sure data written actually gets to the client }
- End;
- DisconnectNamedPipe(hPipe);
- End;
- End;
- End;
- CloseHandle(hPipe);
- CoUninitialize;
- strMessage := 'Pipe thread terminated';
- Synchronize(LogMessage);
- End;
-
- Procedure TPipeServerThread.LogMessage;
- Begin
- HelperMainForm.LogMessage(strMessage);
- End;
-
- Function TPipeServerThread.ProcessPipeRequest(strRequest : String) : String;
- Var
- iPos : Integer;
- strVerb : String;
- strParam : String;
-
- Begin
- { extract the words from the request (verb & param) }
- iPos := Pos(' ',strRequest);
- strVerb := Copy(strRequest,1,iPos-1);
- strParam := Copy(strRequest,iPos+1,Length(strRequest)-iPos);
- { check what to do with the verb }
- Try
- If HelperMainForm.HelperActive.Checked Then Begin
- { if the "Active" checkbox on the mainform is checked }
- If (ooOutlook = nil) Then ooOutlook := TOutlookObjects.Create;
- If (strVerb = 'CALENDAR') Then Result := GetCalendarResponse(strParam)
- Else If (strVerb = 'CONTACT') Then Result := GetContactResponse(strParam)
- Else If (strVerb = 'TASK') Then Result := GetTaskResponse(strParam)
- Else If (strVerb = 'NOTE') Then Result := GetNoteResponse(strParam)
- Else If (strVerb = 'INBOX') Then Result := GetInboxResponse(strParam)
- Else Result := 'Unknown verb.';
- End
- Else Result := 'Helper application not active';
- Except
- On E : Exception do Result := E.Message;
- End;
- End;
-
- Function TPipeServerThread.GetCalendarResponse(strDate : String) : String;
- Var wY,wM,wD : Word;
- Begin
- DecodeDate(StrToInt(strDate),wY,wM,wD);
- Result := ooOutlook.GetAppointmentsOn(wY,wM,wD)+'<BR>';
- End;
-
- Function TPipeServerThread.GetContactResponse(strIndex : String) : String;
- Begin
- If (strIndex = 'COUNT') Then Result := IntToStr(ooOutlook.GetContactCount)
- Else Result := ooOutlook.GetContactDetails(StrToInt(strIndex));
- End;
-
- Function TPipeServerThread.GetTaskResponse(strIndex : String) : String;
- Begin
- If (strIndex = 'COUNT') Then Result := IntToStr(ooOutlook.GetTaskCount)
- Else Result := ooOutlook.GetTaskDetails(StrToInt(strIndex));
- End;
-
- Function TPipeServerThread.GetNoteResponse(strIndex : String) : String;
- Begin
- If (strIndex = 'COUNT') Then Result := IntToStr(ooOutlook.GetNoteCount)
- Else Result := ooOutlook.GetNoteDetails(StrToInt(strIndex));
- End;
-
- Function TPipeServerThread.GetInboxResponse(strIndex : String) : String;
- Begin
- If (strIndex = 'COUNT') Then Result := IntToStr(ooOutlook.GetInboxMessageCount)
- Else Result := ooOutlook.GetInboxMessageDetails(StrToInt(strIndex));
- End;
-
- end.
-